from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.db.models.expressions import result
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse

from commodity.models import Types, CommodityInfos


# Create your views here.

def commodityView(request):
    """
    商品列表页视图函数
    - 支持分类、排序、搜索
    - 实现分页
    """
    title = '商品分类'
    #页面分类标识
    classContent = 'commoditys'
    # 生成商品分类列表，为一级分类去重
    first = Types.objects.values('first').distinct()
    # 查询Types的所有数据
    typesList = Types.objects.all()
    #获取请求参数
    # t:分类ID，筛选商品类型，查询某个分页的商品信息
    t = request.GET.get('t','')
    # s用于设置商品的排序方式
    s = request.GET.get('s','sold')
    # p用于设置商品信息的页数，默认等于1，代表当前第一页的商品信息
    p = request.GET.get('p','1')
    # n是商品搜索功能的关键字，和模型CommodityInfos的字段name进行模糊匹配
    n = request.GET.get('n','')

    # 初始化商品查询集
    commodityInfos = CommodityInfos.objects.all()
    if t:
        types = Types.objects.filter(id=t).first()
        commodityInfos = commodityInfos.filter(types=types.seconds)
    if s:
        commodityInfos = commodityInfos.order_by('-' + s)
    if n:
        commodityInfos = commodityInfos.filter(name__contains=n)

    # 分页处理
    # 每页显示6条商品信息，如果参数p的值不是整数，那么默认返回第一页的商品信息
    # 如果参数p的值大于分页后的总页数，那么默认返回最后一个商品信息
    paginator = Paginator(commodityInfos, 6)
    try:
        pages = paginator.page(p)
    except PageNotAnInteger:
        pages = paginator.page(1)
    except EmptyPage:
        pages = paginator.page(paginator.num_pages)

    return render(request, 'commodity.html', locals())

def detailView(request):
    """
    商品详情页视图函数
    - 获取指定ID的商品详情
    - 获取销量前五的相关商品
    - 检查商品是否被当前用户收藏
    """
    title = '商品介绍'
    classContent = 'detail'
    items = CommodityInfos.objects.exclude(id=id).order_by('sold')[:5]
    commoditys = CommodityInfos.objects.filter(id=id).first()
    likeList = request.session.get('likes',[])
    likes = True if id in likeList else False

    return render(request,'details.html',locals())

def collectView(request):
    """
    商品收藏视图函数（AJAX接口）
    - 处理用户的收藏请求
    - 更新商品收藏的数量
    - 记录用户收藏状态到Session
    Session Cookie
    """
    id = request.GET.get('id','')
    result = {"result":"已收藏"}
    likes = request.session.get('likes',[])
    if id and not int(id) in likes:
        CommodityInfos.objects.filter(id=id).update(likes=F('likes')+1)
        result["result"] = "收藏成功"
        request.session['likes'] = likes + [int(id)]
    return JsonResponse(result)
